/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.engine;

import fait.ferm.persists.Credit;
import fait.ferm.persists.Ferm;
import fait.ferm.persists.Users;
import java.util.ArrayList;

/**
 * Интерфейс работы с движком. 
 * Все компоненты программы работают с движком только через этот интерфейс
 * @author alex
 */
public interface IfaceEngine {
	/**
	 * Выполняет регистрацию пользователя в системе. 
	 * Просматривает таблицу users на совпадение имени пользователя и пароля. 
	 * Возвращает объект типа Users или null
	 * @param userName имя пользователя
	 * @param password пароль
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект Users (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	public ResultEngine login(String userName, String password);
	/**
	 * Метод создает нового пользователя. Записывает его в таб users.
	 * @param userName имя пользователя
	 * @param password пароль
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект Users (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	public ResultEngine newUser(String userName, String password);

	/**
	 * Возвращает ферму текущего пользователя
	 * @param u - текущий пользователь
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, объект {@link Ferm Ferm} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
	public ResultEngine getFerm(Users u);
	
    /**
	 * Возвращает массив доступных кредитов
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.engine.CreditTypeItem CreditTypeItem}
	 */
    public ResultEngine getCreditType();
    
    /**
	 * Возвращает массив активных кредитов
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.engine.Credit Credit}
	 */
    public ResultEngine getCreditActive();
    
    /**
	 * Возвращает массив штрафов по определённому кредиту
     * @param credit - объект типа {@link Credit Credit} содержащий информацию по кредиту для которого ищем штрафы
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Fine Fine} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    public ResultEngine getFineFrom(Credit credit);
    
    /**
	 * Возвращает массив существующих на ферме групп коров
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Cow_group Cow_group}
	 */
    public ResultEngine getCowGroup();
    
    /**
	 * Возвращает массив существующих в группе коров
     * @param pId - id группы в бд
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Cow Cow}
	 */
    public ResultEngine getCowFromGroup(int pId);
    
    /**
	 * Возвращает массив персонала определённой профессии
     * @param job - профессия
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Staff_type Staff_type}
	 */
    public ResultEngine getStaff_typeFromJob(String job);
	/**
	 * Возвращает массив персонала
	 * @return  ResultEngine, содержащий в поле <code>obj</code>, массив элементов типа {@link Staff_table Staff_table} (если успешно) или null и объект ошибки в поле <code>error</code>
	 */
    public ResultEngine getStaff_table();
    
	/**
	 * Метод возвращает дерево категорий в главном окне. Дерево представлено в виде массива объектов
	* @param fa - фермa зарегисрированного пользователя	 
	* @return ResultEngine, содержащий в поле <code>obj</code> дерево в виде массива объектов типа
	 * {@link fait.ferm.engine.TreeArrItem TreeArrItem}
	 */
	public ResultEngine getMainCategoryTree(Ferm fa);

    /**
	 * Возвращает массив имеющегося на ферме оборудования
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Equipment Equipment}
	 */
    public ResultEngine getEquipment();
	
    /**
	 * Возвращает массив показаний счетчиков ресурсов на ферме
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Resource_counter Resource_counter}
	 */
    public ResultEngine getResourceCounters();
    /**
	 * Возвращает массив количества материалов на складе
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Resource_counter Resource_counter}
	 */
    public ResultEngine getSuppliesQuantity();
    /**
	 * Возвращает массив количества молока на складе
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Resource_counter Resource_counter}
	 */
    public ResultEngine getMilkQuantity();
    /**
	 * Возвращает массив действующих планов
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Plan Plan}
	 */
    public ResultEngine getCurrentPlan();
    /**
	 * Возвращает массив поломок всех оборудований
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Equipment_breakdown Equipment_breakdown}
	 */
    public ResultEngine getEquipment_breakdown();
    /**
	 * Возвращает массив деталей плана для групп
     * @param Plan - план для которого ищутся детали
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Plan_details_care Plan_details_care}
	 */
    public ResultEngine getPlanDetailsCareFromPlan(fait.ferm.persists.Plan Plan);
    /**
	 * Возвращает массив разовых деталей плана
     * @param Plan - план для которого ищутся детали
	 * @return ResultEngine, содержащий в поле <code>obj</code> массив объектов типа
	 * {@link fait.ferm.persists.Plan_details_care_ex Plan_details_care_ex}
	 */
    public ResultEngine getPlanDetailsCareExFromPlan(fait.ferm.persists.Plan Plan);
}
